// C++ for the Windows Runtime v1.0.161012.5
// Copyright (c) 2016 Microsoft Corporation. All rights reserved.

#pragma once

#include "Windows.Perception.Spatial.Surfaces.1.h"

WINRT_EXPORT namespace winrt {

namespace ABI::Windows::Foundation {

#ifndef WINRT_GENERIC_b425d126_1069_563f_a863_44a30a8f071d
#define WINRT_GENERIC_b425d126_1069_563f_a863_44a30a8f071d
template <> struct __declspec(uuid("b425d126-1069-563f-a863-44a30a8f071d")) __declspec(novtable) IAsyncOperation<winrt::Windows::Perception::Spatial::SpatialPerceptionAccessStatus> : impl_IAsyncOperation<winrt::Windows::Perception::Spatial::SpatialPerceptionAccessStatus> {};
#endif


}

namespace ABI::Windows::Foundation::Collections {

#ifndef WINRT_GENERIC_1edda1c2_0f6e_516c_80b8_7687dcd1280e
#define WINRT_GENERIC_1edda1c2_0f6e_516c_80b8_7687dcd1280e
template <> struct __declspec(uuid("1edda1c2-0f6e-516c-80b8-7687dcd1280e")) __declspec(novtable) IVectorView<winrt::Windows::Graphics::DirectX::DirectXPixelFormat> : impl_IVectorView<winrt::Windows::Graphics::DirectX::DirectXPixelFormat> {};
#endif


}

namespace ABI::Windows::Foundation {

#ifndef WINRT_GENERIC_09f88309_9f81_5207_bdb2_abef926db18f
#define WINRT_GENERIC_09f88309_9f81_5207_bdb2_abef926db18f
template <> struct __declspec(uuid("09f88309-9f81-5207-bdb2-abef926db18f")) __declspec(novtable) IReference<Windows::Perception::Spatial::SpatialBoundingOrientedBox> : impl_IReference<Windows::Perception::Spatial::SpatialBoundingOrientedBox> {};
#endif

#ifndef WINRT_GENERIC_f5938fad_a8a1_5f7e_9440_bdb781ad26b6
#define WINRT_GENERIC_f5938fad_a8a1_5f7e_9440_bdb781ad26b6
template <> struct __declspec(uuid("f5938fad-a8a1-5f7e-9440-bdb781ad26b6")) __declspec(novtable) IAsyncOperation<Windows::Perception::Spatial::Surfaces::SpatialSurfaceMesh> : impl_IAsyncOperation<Windows::Perception::Spatial::Surfaces::SpatialSurfaceMesh> {};
#endif


}

namespace ABI::Windows::Foundation::Collections {

#ifndef WINRT_GENERIC_eaa722b9_2859_593d_bb66_0c538e415e71
#define WINRT_GENERIC_eaa722b9_2859_593d_bb66_0c538e415e71
template <> struct __declspec(uuid("eaa722b9-2859-593d-bb66-0c538e415e71")) __declspec(novtable) IMapView<GUID, Windows::Perception::Spatial::Surfaces::SpatialSurfaceInfo> : impl_IMapView<GUID, Windows::Perception::Spatial::Surfaces::SpatialSurfaceInfo> {};
#endif

#ifndef WINRT_GENERIC_89e8f1ee_3a2a_5b69_a786_cddcf7456a3a
#define WINRT_GENERIC_89e8f1ee_3a2a_5b69_a786_cddcf7456a3a
template <> struct __declspec(uuid("89e8f1ee-3a2a-5b69-a786-cddcf7456a3a")) __declspec(novtable) IIterable<Windows::Perception::Spatial::SpatialBoundingVolume> : impl_IIterable<Windows::Perception::Spatial::SpatialBoundingVolume> {};
#endif


}

namespace ABI::Windows::Foundation {

#ifndef WINRT_GENERIC_8b31274a_7693_52be_9014_b0f5f65a3539
#define WINRT_GENERIC_8b31274a_7693_52be_9014_b0f5f65a3539
template <> struct __declspec(uuid("8b31274a-7693-52be-9014-b0f5f65a3539")) __declspec(novtable) TypedEventHandler<Windows::Perception::Spatial::Surfaces::SpatialSurfaceObserver, Windows::IInspectable> : impl_TypedEventHandler<Windows::Perception::Spatial::Surfaces::SpatialSurfaceObserver, Windows::IInspectable> {};
#endif

#ifndef WINRT_GENERIC_6ced54c8_7689_525a_80e1_956a9d85cd83
#define WINRT_GENERIC_6ced54c8_7689_525a_80e1_956a9d85cd83
template <> struct __declspec(uuid("6ced54c8-7689-525a-80e1-956a9d85cd83")) __declspec(novtable) AsyncOperationCompletedHandler<winrt::Windows::Perception::Spatial::SpatialPerceptionAccessStatus> : impl_AsyncOperationCompletedHandler<winrt::Windows::Perception::Spatial::SpatialPerceptionAccessStatus> {};
#endif


}

namespace ABI::Windows::Foundation::Collections {

#ifndef WINRT_GENERIC_ea016190_ac80_5840_8f58_ff434c7b2907
#define WINRT_GENERIC_ea016190_ac80_5840_8f58_ff434c7b2907
template <> struct __declspec(uuid("ea016190-ac80-5840-8f58-ff434c7b2907")) __declspec(novtable) IIterator<winrt::Windows::Graphics::DirectX::DirectXPixelFormat> : impl_IIterator<winrt::Windows::Graphics::DirectX::DirectXPixelFormat> {};
#endif

#ifndef WINRT_GENERIC_3908f2c6_1aee_5129_b9a6_2a6e01d9507e
#define WINRT_GENERIC_3908f2c6_1aee_5129_b9a6_2a6e01d9507e
template <> struct __declspec(uuid("3908f2c6-1aee-5129-b9a6-2a6e01d9507e")) __declspec(novtable) IIterable<winrt::Windows::Graphics::DirectX::DirectXPixelFormat> : impl_IIterable<winrt::Windows::Graphics::DirectX::DirectXPixelFormat> {};
#endif


}

namespace ABI::Windows::Foundation {

#ifndef WINRT_GENERIC_4680f7f6_44c5_5fc6_8d51_d6962915fa23
#define WINRT_GENERIC_4680f7f6_44c5_5fc6_8d51_d6962915fa23
template <> struct __declspec(uuid("4680f7f6-44c5-5fc6-8d51-d6962915fa23")) __declspec(novtable) AsyncOperationCompletedHandler<Windows::Perception::Spatial::Surfaces::SpatialSurfaceMesh> : impl_AsyncOperationCompletedHandler<Windows::Perception::Spatial::Surfaces::SpatialSurfaceMesh> {};
#endif


}

namespace ABI::Windows::Foundation::Collections {

#ifndef WINRT_GENERIC_a6bdf94a_2697_5ff2_89dc_a17cecdcda6c
#define WINRT_GENERIC_a6bdf94a_2697_5ff2_89dc_a17cecdcda6c
template <> struct __declspec(uuid("a6bdf94a-2697-5ff2-89dc-a17cecdcda6c")) __declspec(novtable) IKeyValuePair<GUID, Windows::Perception::Spatial::Surfaces::SpatialSurfaceInfo> : impl_IKeyValuePair<GUID, Windows::Perception::Spatial::Surfaces::SpatialSurfaceInfo> {};
#endif

#ifndef WINRT_GENERIC_eb8385c5_0775_5415_8f76_327e6e388ac5
#define WINRT_GENERIC_eb8385c5_0775_5415_8f76_327e6e388ac5
template <> struct __declspec(uuid("eb8385c5-0775-5415-8f76-327e6e388ac5")) __declspec(novtable) IIterator<Windows::Perception::Spatial::SpatialBoundingVolume> : impl_IIterator<Windows::Perception::Spatial::SpatialBoundingVolume> {};
#endif

#ifndef WINRT_GENERIC_6d328390_f279_5f39_9682_bba0cd81489b
#define WINRT_GENERIC_6d328390_f279_5f39_9682_bba0cd81489b
template <> struct __declspec(uuid("6d328390-f279-5f39-9682-bba0cd81489b")) __declspec(novtable) IIterator<Windows::Foundation::Collections::IKeyValuePair<GUID, Windows::Perception::Spatial::Surfaces::SpatialSurfaceInfo>> : impl_IIterator<Windows::Foundation::Collections::IKeyValuePair<GUID, Windows::Perception::Spatial::Surfaces::SpatialSurfaceInfo>> {};
#endif

#ifndef WINRT_GENERIC_868757d1_be21_51d9_8dee_a958b9deec71
#define WINRT_GENERIC_868757d1_be21_51d9_8dee_a958b9deec71
template <> struct __declspec(uuid("868757d1-be21-51d9-8dee-a958b9deec71")) __declspec(novtable) IIterable<Windows::Foundation::Collections::IKeyValuePair<GUID, Windows::Perception::Spatial::Surfaces::SpatialSurfaceInfo>> : impl_IIterable<Windows::Foundation::Collections::IKeyValuePair<GUID, Windows::Perception::Spatial::Surfaces::SpatialSurfaceInfo>> {};
#endif


}

namespace Windows::Perception::Spatial::Surfaces {

template <typename D>
struct WINRT_EBO impl_ISpatialSurfaceInfo
{
    GUID Id() const;
    Windows::Foundation::DateTime UpdateTime() const;
    Windows::Foundation::IReference<Windows::Perception::Spatial::SpatialBoundingOrientedBox> TryGetBounds(const Windows::Perception::Spatial::SpatialCoordinateSystem & coordinateSystem) const;
    Windows::Foundation::IAsyncOperation<Windows::Perception::Spatial::Surfaces::SpatialSurfaceMesh> TryComputeLatestMeshAsync(double maxTrianglesPerCubicMeter) const;
    Windows::Foundation::IAsyncOperation<Windows::Perception::Spatial::Surfaces::SpatialSurfaceMesh> TryComputeLatestMeshAsync(double maxTrianglesPerCubicMeter, const Windows::Perception::Spatial::Surfaces::SpatialSurfaceMeshOptions & options) const;
};

template <typename D>
struct WINRT_EBO impl_ISpatialSurfaceMesh
{
    Windows::Perception::Spatial::Surfaces::SpatialSurfaceInfo SurfaceInfo() const;
    Windows::Perception::Spatial::SpatialCoordinateSystem CoordinateSystem() const;
    Windows::Perception::Spatial::Surfaces::SpatialSurfaceMeshBuffer TriangleIndices() const;
    Windows::Perception::Spatial::Surfaces::SpatialSurfaceMeshBuffer VertexPositions() const;
    Windows::Foundation::Numerics::float3 VertexPositionScale() const;
    Windows::Perception::Spatial::Surfaces::SpatialSurfaceMeshBuffer VertexNormals() const;
};

template <typename D>
struct WINRT_EBO impl_ISpatialSurfaceMeshBuffer
{
    Windows::Graphics::DirectX::DirectXPixelFormat Format() const;
    uint32_t Stride() const;
    uint32_t ElementCount() const;
    Windows::Storage::Streams::IBuffer Data() const;
};

template <typename D>
struct WINRT_EBO impl_ISpatialSurfaceMeshOptions
{
    Windows::Graphics::DirectX::DirectXPixelFormat VertexPositionFormat() const;
    void VertexPositionFormat(Windows::Graphics::DirectX::DirectXPixelFormat value) const;
    Windows::Graphics::DirectX::DirectXPixelFormat TriangleIndexFormat() const;
    void TriangleIndexFormat(Windows::Graphics::DirectX::DirectXPixelFormat value) const;
    Windows::Graphics::DirectX::DirectXPixelFormat VertexNormalFormat() const;
    void VertexNormalFormat(Windows::Graphics::DirectX::DirectXPixelFormat value) const;
    bool IncludeVertexNormals() const;
    void IncludeVertexNormals(bool value) const;
};

template <typename D>
struct WINRT_EBO impl_ISpatialSurfaceMeshOptionsStatics
{
    Windows::Foundation::Collections::IVectorView<winrt::Windows::Graphics::DirectX::DirectXPixelFormat> SupportedVertexPositionFormats() const;
    Windows::Foundation::Collections::IVectorView<winrt::Windows::Graphics::DirectX::DirectXPixelFormat> SupportedTriangleIndexFormats() const;
    Windows::Foundation::Collections::IVectorView<winrt::Windows::Graphics::DirectX::DirectXPixelFormat> SupportedVertexNormalFormats() const;
};

template <typename D>
struct WINRT_EBO impl_ISpatialSurfaceObserver
{
    Windows::Foundation::Collections::IMapView<GUID, Windows::Perception::Spatial::Surfaces::SpatialSurfaceInfo> GetObservedSurfaces() const;
    void SetBoundingVolume(const Windows::Perception::Spatial::SpatialBoundingVolume & bounds) const;
    void SetBoundingVolumes(const Windows::Foundation::Collections::IIterable<Windows::Perception::Spatial::SpatialBoundingVolume> & bounds) const;
    event_token ObservedSurfacesChanged(const Windows::Foundation::TypedEventHandler<Windows::Perception::Spatial::Surfaces::SpatialSurfaceObserver, Windows::IInspectable> & handler) const;
    using ObservedSurfacesChanged_revoker = event_revoker<ISpatialSurfaceObserver>;
    ObservedSurfacesChanged_revoker ObservedSurfacesChanged(auto_revoke_t, const Windows::Foundation::TypedEventHandler<Windows::Perception::Spatial::Surfaces::SpatialSurfaceObserver, Windows::IInspectable> & handler) const;
    void ObservedSurfacesChanged(event_token token) const;
};

template <typename D>
struct WINRT_EBO impl_ISpatialSurfaceObserverStatics
{
    Windows::Foundation::IAsyncOperation<winrt::Windows::Perception::Spatial::SpatialPerceptionAccessStatus> RequestAccessAsync() const;
};

struct ISpatialSurfaceInfo :
    Windows::IInspectable,
    impl::consume<ISpatialSurfaceInfo>
{
    ISpatialSurfaceInfo(std::nullptr_t = nullptr) noexcept {}
    auto operator->() const noexcept { return ptr<ISpatialSurfaceInfo>(m_ptr); }
};

struct ISpatialSurfaceMesh :
    Windows::IInspectable,
    impl::consume<ISpatialSurfaceMesh>
{
    ISpatialSurfaceMesh(std::nullptr_t = nullptr) noexcept {}
    auto operator->() const noexcept { return ptr<ISpatialSurfaceMesh>(m_ptr); }
};

struct ISpatialSurfaceMeshBuffer :
    Windows::IInspectable,
    impl::consume<ISpatialSurfaceMeshBuffer>
{
    ISpatialSurfaceMeshBuffer(std::nullptr_t = nullptr) noexcept {}
    auto operator->() const noexcept { return ptr<ISpatialSurfaceMeshBuffer>(m_ptr); }
};

struct ISpatialSurfaceMeshOptions :
    Windows::IInspectable,
    impl::consume<ISpatialSurfaceMeshOptions>
{
    ISpatialSurfaceMeshOptions(std::nullptr_t = nullptr) noexcept {}
    auto operator->() const noexcept { return ptr<ISpatialSurfaceMeshOptions>(m_ptr); }
};

struct ISpatialSurfaceMeshOptionsStatics :
    Windows::IInspectable,
    impl::consume<ISpatialSurfaceMeshOptionsStatics>
{
    ISpatialSurfaceMeshOptionsStatics(std::nullptr_t = nullptr) noexcept {}
    auto operator->() const noexcept { return ptr<ISpatialSurfaceMeshOptionsStatics>(m_ptr); }
};

struct ISpatialSurfaceObserver :
    Windows::IInspectable,
    impl::consume<ISpatialSurfaceObserver>
{
    ISpatialSurfaceObserver(std::nullptr_t = nullptr) noexcept {}
    auto operator->() const noexcept { return ptr<ISpatialSurfaceObserver>(m_ptr); }
};

struct ISpatialSurfaceObserverStatics :
    Windows::IInspectable,
    impl::consume<ISpatialSurfaceObserverStatics>
{
    ISpatialSurfaceObserverStatics(std::nullptr_t = nullptr) noexcept {}
    auto operator->() const noexcept { return ptr<ISpatialSurfaceObserverStatics>(m_ptr); }
};

}

}
